﻿/* AppFramework - Bussines application framework
 * 
 * Интерфейс доступа к базам данных
 * Copyright 2011 by Vladimir Tashkinov
 */

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections.ObjectModel;
using System.Data;


namespace DatabaseInterface
{
    /// <summary>
    /// Возвращаемый набор данных.
    /// </summary>
    public class DbResult
    {
        /// <summary>
        /// Возвращает результат запроса.
        /// </summary>
        public string ResultText;
        /// <summary>
        /// Возвращает True - если произошла ошибка.
        /// </summary>
        public string ErrorText;
        /// <summary>
        /// Возвращает текст ошибки.
        /// </summary>
        public bool HasError;
    }

    /// <summary>
    /// Возвращаемый набор данных.
    /// </summary>
    public class DbResultData
    {
        /// <summary>
        /// Возвращает результат запроса.
        /// </summary>
        public DataTable ResultData;
        /// <summary>
        /// Возвращает True - если произошла ошибка.
        /// </summary>
        public string ErrorText;
        /// <summary>
        /// Возвращает текст ошибки.
        /// </summary>
        public bool HasError;
    }


    public class DBInterface
    {
        // возвращает строку соединения с БД
        private string CSBuilder(DataBases dbType, string server, string database, string user, string password)
        {
            string cs = "";
            switch(dbType){
                case DataBases.MySQL:
                    {
                        cs = String.Format("Server={0};Database={1};Uid={2};Pwd={3};", server, database, user, password);
                    }
                    break;
                case DataBases.MsSQL:
                    {
                        cs = String.Format(@"Data Source={0};Initial Catalog={1};User Id={2};Password={3};", server, database, user, password);
                    }
                    break;
                default: break;
            }
            return cs;
        }
        public bool State
        {
            get { return isConnect; }
        }
            
        public enum DataBases
        {
            MySQL,
            MsSQL,
            Unknown
        }

        private DataBases dbType;
        private string server;
        private string database;
        private string user;
        private string password;
        private bool isConnect = false;
        private string version;

        // Свойства для доступа к внутренним полям класса
        public DataBases DbType 
        {
            get { return dbType; }
            set { dbType = value; }
        }

        public string Server
        {
            get { return server; }
            set { server = value; }
        }

        public string Database
        {
            get { return database; }
            set { database = value; }
        }
        public string User
        {
            get { return user; }
            set { user = value; }
        }
        public string Password
        {
            get { return password; }
            set { password = value; }
        }
        public string Version
        {
            get { return version; }
        }
        // Консктруктор класса
        public DBInterface(DataBases dbType, string server, string database, string user, string password)
        {
            this.dbType = dbType;
            this.server = server;
            this.database = database;
            this.user = user;
            this.password = password;
            DbResult res = ExecScalarSQL(DataBases.MySQL, "select version()");
            version = res.ResultText;
            if (!res.HasError)
                isConnect = true;

        }

        //выполнить запрос, возвращающий один результат
        public DbResult ExecScalarSQL(DataBases dbType, string request)
        {
            switch (dbType)
            {
                case DataBases.MySQL:
                    return DbMySql.SqlScalar(request, CSBuilder(dbType, server, database, user, password));
                case DataBases.MsSQL:
                    return DbMsSql.SqlScalar(request, CSBuilder(dbType, server, database, user, password));
                default:
                    return null;
            }
        }

        // выполнить запрос не возвращающий результатов
        public DbResult ExcecSQL(DataBases dbType, string request)
        {
            switch (dbType)
            {
                case DataBases.MySQL:
                    return DbMySql.SqlNoneQuery(request, CSBuilder(dbType, server, database, user, password));
                case DataBases.MsSQL:
                    return DbMsSql.SqlNoneQuery(request, CSBuilder(dbType, server, database, user, password));
                default:
                    return null;
            }
        }

        // выполнить запрос, возвращающий DataSet
        public DbResultData ExcecSQLReturnDataset(DataBases dbType, string request)
        {
            switch (dbType)
            {
                case DataBases.MySQL:
                    return DbMySql.SqlReturnDataset(request, CSBuilder(dbType, server, database, user, password));
                case DataBases.MsSQL:
                    return DbMsSql.SqlReturnDataset(request, CSBuilder(dbType, server, database, user, password));
                default:
                    return null;
            }
        }
    }
}

